from core import data_model

class Batch(data_model.Batch):

    def __init__(self, number, papers_count, data):
        self.__number = number
        self.__papers_count = papers_count
        self.__data = data
        
        # Выполненность проверок
        self.__progress = [{}, {}] # Пустые множества проверенных задач по первой и второй проверке

        # Временные атрибуты
        self.__total_time = QTime(0, 0, 0)
        self.__current_time = QTime(0, 0, 0)
        
        # текущая проверяющая группа
        self.__group = None
        
        # Признак проблемной пачки
        self.__marked = False
        # Признак пачки, засидевшейся на проверке
        self.__lazy = False
        # Признак того, что осталась ровно одна непроверенная задача
        self.__one_problem_left = False
        
        # Сообщение в лог
        logging.info("Добавлена пачка %s." % str(self.name()))

    def number(self):
        return self.__number

    def papersCount(self):
        return self.__papers_count
        
    def checkedProblems(self, check_num):
        """Список проверенных задач по проверке check_num"""
        return self.__progress[check_num].keys()
    
    def completeProblems(self, cnum=None):
        """Количество проверенных задач"""
        if check_num is not None:
            return len(self.checkedProblems(check_num))
        else:
            return len(self.checkedProblems(0)) + len(self.checkedProblems(1))
    
    def markCompleted(self, problem_num, check_num=None):
        # Если номер проверки cnum явно не указан, то угадываем его
        if cnum is None:
            if self.__progress[0].get(pnum, None) is None:
                cnum = 0
            else:
                cnum = 1
        # Разбираемся со временем проверки
        elapsed_secs = self.current_time.secsTo(QTime.currentTime())
        self.__progress[cnum][pnum] = (self.current_time, self.current_time.addSecs(elapsed_secs))
        self.total_time = self.total_time.addSecs(elapsed_secs)
        # Увеличиваем счетчик проверенных работ в группе проверки
        group = self.__data.groups().find(problem_num)
        group.papers_complete[cnum] += self.papers_count
        # Сообщение в лог
        logging.info("Пачка %s пришла с проверки задачи %d. Проверена за %0.1f минут" % (str(self.name()), pnum+1, elapsed_secs/60.0))
    
    def sendTo(self, problem_num):
        """Послать пачку на проверку задачи"""
        assert(self.__group is None)
        # Если задача не проверена по первому разу или не проверена по второму разу и
        # открыта вторая проверка, то посылаем на проверку
        if problem_num not in self.__progress[0].keys() or \
           (problem_num not in self.__progress[1].keys()):
            self.__group = self.__data.groups().find(problem_num)
            self.__group.addBatch(self)
            self.current_time = QTime.currentTime()
            # Сообщение в лог
            logging.info("Пачка %s ушла на проверку задачи %d" % (str(self.name()), pno + 1))
    
    def return(self, complete=True):
        if self.__group is not None:
            self.__group.takeBatch(self)
            if completed:
                self.markCompleted(problem_num=self.__group.index())
                #self.updateCheckup()
            self.__group = None

#    def updateCheckup(self):
#        """Увеличивает, если нужно номер текущей проверки для пачки"""
#        if self.completeProblems(0) == 6:
#            self.checkup = 1
    def checkupNumber(self):
        if self.completeProblems(0) == 6:
            return 1
        else:
            return 0
    
    def select(self):
        """makes batch selected"""
        Batch.selected_batch = self
    
    def selected(self):
        return data.batches().selected() == self
